ホームに戻る
出典 :
C#のWPFでMainメソッドを編集する - Ararami Studio .NETCore×WPFアプリのMain関数をカスタマイズする - Qiita
関連 :
コマンドライン引数の受け取り(スタートアップ)
目次 :

WPFのエントリポイント (C#)

C#のアプリケーションは Main() メソッドから開始されるが、WPFも例外ではない。
(すべて小文字の main() ではない点に注意)
但しWPFの場合はWindows Formsと異なり、Main() メソッドを含むソースファイル(App.g.cs)が自動生成され、プロジェクトに追加されない。

App.g.cs (コメントのみ改変)
(略) namespace Console_ELP03 { /// アプリケーション public partial class App : System.Windows.Application { /// InitializeComponent [System.Diagnostics.DebuggerNonUserCodeAttribute()] [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "6.0.1.0")] public void InitializeComponent() { #line 5 "..\..\..\App.xaml" this.StartupUri = new System.Uri("MainWindow.xaml", System.UriKind.Relative); //< 最初に開かれるウィンドウ #line default #line hidden } /// Application Entry Point. /// アプリケーションのエントリポイント( Main() ) [System.STAThreadAttribute()] [System.Diagnostics.DebuggerNonUserCodeAttribute()] [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "6.0.1.0")] public static void Main() { Console_ELP03.App app = new Console_ELP03.App(); app.InitializeComponent(); app.Run(); } } }
ここで、Main() メソッドはアプリケーションの生成と起動を行っている。
また、その中で呼ばれる InitializeComponent() はスタートアップウィンドウの設定を行っている。
(このスタートアップウィンドウは App.xaml で StartUpUri として指定されたもの。)

Main() メソッドを編集する

通常の用途では、アプリケーション全体の初期化はスタートアップウィンドウのコンストラクタに記述すればよいが、
スタートアップウィンドウが開く前に処理を行いたい場合は、Main() メソッドを独自に定義する。
但し、単にコマンドライン引数を受け取るだけであれば Main() メソッドを編集する必要は無い。 コマンドライン引数の受け取り(スタートアップ)を参照。

手順

  1. 「ソリューション エクスプローラー」上で App.xaml を選択、右クリックし「プロパティ」を開く。
  2. 「ビルド アクション」を「ApplicationDefinition(アプリケーション定義)」から「Page(ページ)」に変更すると、
    Main() メソッドが自動生成されなくなる。

  3. App.xaml.csを開き、Main() メソッドを追加する。
    public partial class App : Application { [STAThread] public static void Main() { App app = new App(); app.InitializeComponent(); // スプラッシュスクリーン、スタートアップウィンドウ表示 app.Run(); // app.Run() より後は、スタートアップウィンドウを閉じた後に実行される } }
    ここで、属性として [STAThread] が指定されているが、これはCOMオブジェクトの取り扱いを定めるもので、WPFでは標準となっている。
    記述を省略することはできないので注意。
    また、app.Run() 終了後はアプリケーションオブジェクトが存在しなくなるため、ウィンドウを開くことができなくなる(要調査)。

上記手順が失敗する場合


環境の設定によっては上図のエラーが表示され、App.xaml のプロパティが変更できないことがある。
(エラーが発生した場合、そのまま App.xaml がプロジェクトから除外される。)
これは、App.xaml の「ビルド アクション」のデフォルトが「アプリケーション定義」となっているため。
以下の手順を経ることで「ビルド アクション」を変更できるようになる。
  1. プロジェクトファイル(CSPROJ)を編集モードで開く。
    (ソリューションエクスプローラーからは、プロジェクトファイルを右クリックし「プロジェクト ファイルの編集」を選択する。)
  2. PropertyGroup タグ内に、以下の通りに EnableDefaultApplicationDefinition の記述を追加する。
  3. プロジェクトをクリーンする。